package ar.uade.edu.fain.ad.server.dao.jpa;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.classic.Session;

import ar.uade.edu.fain.ad.common.transfer.ProductoVO;
import ar.uade.edu.fain.ad.server.business.CompraNoVentaProducto;
import ar.uade.edu.fain.ad.server.business.CompraVentaProducto;
import ar.uade.edu.fain.ad.server.business.ElaboracionNoVentaProducto;
import ar.uade.edu.fain.ad.server.business.ElaboracionVentaProducto;
import ar.uade.edu.fain.ad.server.business.Producto;
import ar.uade.edu.fain.ad.server.business.Unidad;
import ar.uade.edu.fain.ad.server.dao.ProductoDAO;
import ar.uade.edu.fain.ad.server.dao.UnidadDAO;
import ar.uade.edu.fain.ad.server.dao.entity.CompraNoVentaEntity;
import ar.uade.edu.fain.ad.server.dao.entity.CompraVentaEntity;
import ar.uade.edu.fain.ad.server.dao.entity.ElaboracionNoVentaEntity;
import ar.uade.edu.fain.ad.server.dao.entity.ElaboracionVentaEntity;
import ar.uade.edu.fain.ad.server.dao.entity.ProductoEntity;
import ar.uade.edu.fain.ad.server.util.persistence.HibernateUtil;

public class ProductoJpaDAO 
		extends GenericJpaDAO<Producto, ProductoEntity, Long> 
		implements ProductoDAO {

	private UnidadDAO unidadDAO;

	public ProductoJpaDAO() {
		super(ProductoEntity.class);
	}

	public UnidadDAO getUnidadDAO() {
		return unidadDAO;
	}

	public void setUnidadDAO(UnidadDAO unidadDAO) {
		this.unidadDAO = unidadDAO;
	}

	@Override
	protected ProductoEntity toEntity(Producto business) {
		return null;
	}

	@Override
	protected Producto toBusiness(ProductoEntity entity) {
		Producto business = new Producto();
		if (entity instanceof CompraVentaEntity) {
			business = new CompraVentaProducto();
		} else if (entity instanceof CompraNoVentaEntity) {
			business = new CompraNoVentaProducto();
		} else if (entity instanceof ElaboracionVentaEntity) {
			business = new ElaboracionVentaProducto();
		} else if (entity instanceof ElaboracionNoVentaEntity) {
			business = new ElaboracionNoVentaProducto();
		}
		business.setId(entity.getId());
		business.setNombre(entity.getNombre());
		final Unidad unidad = getUnidadDAO().get(
				entity.getUnidadUso().getId());
		business.setUnidadUso(unidad);
		return business;
	}

	public static void registrarMercaderia(List<ProductoVO> mercaderias) {
		
		if (mercaderias == null || mercaderias.isEmpty()) {
			throw new IllegalArgumentException(
					"No hay productos a grabar.");
		}
		
		List<ProductoEntity> mercaderiasEntity = new ArrayList<ProductoEntity>();
		for(int i=0;i < mercaderias.size();i++){
			
			ProductoEntity prod = ProductoJpaDAO.toEntity(mercaderias.get(i));
			mercaderiasEntity.add(prod); 			
		}
		
		for(int i=0;i < mercaderiasEntity.size();i++){
			
			 grabarProducto(mercaderiasEntity.get(i));			
		}
		
	}

	private static void grabarProducto(ProductoEntity productoEntity) {
		
		Session session = (Session) HibernateUtil.get().getSession();
				
		session.beginTransaction();
		session.persist(productoEntity);
		session.flush();
		session.getTransaction().commit();
		session.close();
		
	}

	private static ProductoEntity toEntity(ProductoVO productoVO) {
		
		ProductoEntity prodentity = new ProductoEntity();
		prodentity.setId(productoVO.getId());
		prodentity.setNombre(productoVO.getNombre());
		prodentity.setUnidadUso(Unidad.toEntity(productoVO.getUnidadUso()));
		
		return prodentity;
	}

}
